package com.ybwh.springboot2.util;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ybwh.springboot2.common.auth.UserInfo;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;


@Slf4j
public class SatokenUtils {


    public static final String USER_ID = "user_id";
    public static final String USER_INFO = "user_info";


    private SatokenUtils() {

    }

    public static UserInfo getUserInfo(String token) {
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        if(null  == tokenInfo){
            return null;
        }
        // 第3步，返回给前端
        log.info("---------------tokenInfo={}", JSON.toJSONString(tokenInfo));
        // 指定扩展数据，这里可以存放登录数据
        SaSession session = StpUtil.getTokenSessionByToken(token);
        String json = (String) session.get(USER_ID);
        return JSONObject.parseObject(json, UserInfo.class);
    }

    public static UserInfo getUserInfo() {
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        if(null  == tokenInfo){
            return null;
        }
        // 第3步，返回给前端
        log.info("---------------tokenInfo={}", JSON.toJSONString(tokenInfo));
        // 指定扩展数据，这里可以存放登录数据
        SaSession session = StpUtil.getTokenSessionByToken(tokenInfo.getTokenValue());
        String json = (String) session.get(USER_INFO);
        return JSONObject.parseObject(json, UserInfo.class);
    }

    public static String getUserId(String token) {
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        if(null  == tokenInfo){
            return null;
        }
        // 第3步，返回给前端
        log.info("---------------tokenInfo={}", JSON.toJSONString(tokenInfo));
        // 指定扩展数据，这里可以存放登录数据
        SaSession session = StpUtil.getTokenSessionByToken(token);
        return (String) session.get(USER_ID);
    }

    public static String getUserId() {
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        if(null  == tokenInfo){
            return null;
        }
        // 第3步，返回给前端
        log.info("---------------tokenInfo={}", JSON.toJSONString(tokenInfo));
        // 指定扩展数据，这里可以存放登录数据
        SaSession session = StpUtil.getTokenSessionByToken(tokenInfo.getTokenValue());
        return (String) session.get(USER_ID);
    }

    /**
     * 登录
     *
     * @param userInfo 用户
     * @param dataMap  会话数据
     * @return token
     */
    public static String login(UserInfo userInfo, Map<String, Object> dataMap) {
        // 第1步，先登录上,可以用用户id做id
        String userId = userInfo.getId().toString();
        StpUtil.login(userId);

        // 第2步，获取 Token  相关参数
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        // 第3步，返回给前端
        log.info("---------------tokenInfo={}", JSON.toJSONString(tokenInfo));
        // 指定扩展数据，这里可以存放登录数据
        SaSession session = StpUtil.getTokenSessionByToken(tokenInfo.getTokenValue());
        if (null != dataMap && dataMap.size() > 0) {
            for (Map.Entry<String, Object> e : dataMap.entrySet()) {
                session.set(e.getKey(), e.getValue());
            }
        }

        session.set(USER_ID, userId);
        session.set(USER_INFO, JSON.toJSONString(userInfo));

        return tokenInfo.getTokenValue();
    }


    /**
     * 获取token的名称
     *
     * @return
     */
    public static String getTokenName() {
        // 从配置里拿token的名称
        return StpUtil.getTokenName();
    }

    /**
     * 获取token
     */
    public static String getToken() {
        /**
         * 会从4个地方拿
         *
         * // 1. 尝试从Storage里读取
         * // 2. 尝试从请求体里面读取
         * // 3. 尝试从header里读取
         * // 4. 尝试从cookie里读取
         */
        return StpUtil.getTokenValue();

    }

    /**
     * 获取当前会话信息
     *
     * @param token
     * @return
     */
    public static SaSession getSession(String token) {
        return StpUtil.getTokenSessionByToken(token);
    }

    /**
     * 获取登录的用户ID
     *
     * @param request
     * @return
     */
    public static String getUserId(HttpServletRequest request) {
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return (String) tokenInfo.getLoginId();
    }

    /**
     * 退出
     *
     * @param token
     */
    public static void logout(String token) {
        SaSession session = StpUtil.getTokenSessionByToken(token);
        if (null != session) {
            return;
        }

        // 当前会话注销登录
        StpUtil.logoutByTokenValue(token);
    }

    public static SaTokenInfo getTokenInfo() {
        return  StpUtil.getTokenInfo();
    }
}
